#ifndef __ADC__H__
#define __ADC__H__

#include "gd32f4xx.h"
#include "systick.h"

#define  USE_ADC_0  1  // 使用ADC0

/**
 *
  adc在配置的时候 一定要先赋能adc 在校准adc
  常规规则通道配置了dma就不可以使用数据转换完成中断了 他们冲突 但是注入规则可以使用中断不影响
  adc一次最多转换16个通道
  dma 外设到内存 检测到有数据会自动执行
  16-18 通道 需要先打开开关
  扫描模式: 不开启:只采样并转换第一个配置的通道  开启:根据配置的顺序 先采样 并转换第一个 然后依次 。。。
  连续模式:
        不开启: 只转换一次
        开启: 转换一次后 不需要再次触发 自动触发转换
        连续模式会清楚数据状态的寄存器（中断相关的）  先触发中断后清除
  常规规则下 转换结果放置在同一个16bit寄存器中
  注入规则下 转换结果放置在4个16bit寄存器中
  dma只负责常规规则下的数据拷贝
  adc 看门狗模拟 单个通道不好用 序列通道可以 但是如果配置了连续模式 触发后 卡死 没解决
**/
#if USE_ADC_0
//**************************常规规则|注入规则|DMA * ****************************/

#define ADC0_CLOCK_DIV                       ADC_ADCCK_PCLK2_DIV8   // 分频系数 所有的adcx 都用这个
#define ADC0_RESOLUTION                      ADC_RESOLUTION_12B     // 分辨率
#define ADC0_NORMAL_CHANNEL_NUM               1                      //常规规则配置的通道数量 
#define ADC0_INSERTED_CHANNEL_NUM             0                      //注入规则配置的通道数量
#define ADC0_SCANMOD_ENABLE                  ENABLE                 //扫描模式  ENABLE DISABLE
#define ADC0_CONTINUOUS_ENABLE               DISABLE                 //连续模式  ENABLE DISABLE

#define ADC0_DMA_ENABLE                       1                     // 是否启用DMA功能 

//规则配置
#define ADC_CHANNEL_CONFIG()  { \
	/* 16-18通道配置 */ \
	adc_channel_16_to_18(ADC_TEMP_VREF_CHANNEL_SWITCH, ENABLE); \
	/* 常规规则 : 参数： 指定ADC 外设  通道的优先级  配置的 ADC 通道   采样时间(15个周期)*/ \
	adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_15); \
	adc_channel_length_config(ADC0, ADC_ROUTINE_CHANNEL, ADC0_NORMAL_CHANNEL_NUM); \
}


// #define ADC_CHANNEL_CONFIG()  { \
// 	/* 注入规则 : 参数： 指定ADC 外设  通道的优先级  配置的 ADC 通道   采样时间(15个周期)  */ \
// 	adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_16, ADC_SAMPLETIME_15); \
// 	adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL,ADC0_INSERTED_CHANNEL_NUM);\
// 	/* 常规规则 : 参数： 指定ADC 外设  通道的优先级  配置的 ADC 通道   采样时间(15个周期)*/ \
// 	adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_15); \
// 	adc_channel_length_config(ADC0, ADC_ROUTINE_CHANNEL, ADC0_NORMAL_CHANNEL_NUM); \
// 	/* 16-18通道配置 */ \
// 	adc_channel_16_to_18(ADC_TEMP_VREF_CHANNEL_SWITCH, ENABLE); \
// }

// 引脚配置部分
// #define ADC0_GPI0_CONFIG()  {}
#define ADC0_GPI0_CONFIG()  {\
      rcu_periph_clock_enable(RCU_GPIOA);\
      gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);}
//*************************************************************************/

// 传入一个保存转换数据的数组 长度与常规通道数一致 这个数组中 只保存常规通道的数据
void ADC_0_INIT(uint16_t* adc_data_arr);
void ADC_0_routine_trigger();
void ADC_0_inserted_trigger();
uint16_t  ADC_inserted_channel_result(uint8_t inserted_channel);
#endif
#endif

